package action;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.StringTokenizer;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

import controlador.Controlador;

import modelo.diagrama.de.classes.Agregacao;
import modelo.diagrama.de.classes.Associacao;
import modelo.diagrama.de.classes.Classe;
import modelo.diagrama.de.classes.Composicao;
import modelo.diagrama.de.classes.Generalizacao;
import modelo.diagrama.de.classes.Nota;
import modelo.diagramas.ElementoDeModelo;
import modelo.diagramas.ObjetoBase;

public class SalvarAction extends AbstractAction {

	JFileChooser chooser = new JFileChooser();
	JFrame frame = new JFrame();
	String nomeArquivo;

	public SalvarAction() {
		super("Salvar");
		this.putValue(Action.SMALL_ICON, new ImageIcon("new.gif"));
		this.putValue(Action.SHORT_DESCRIPTION,
				"Salva em um arquivo o diagrama");
	}

	public void actionPerformed(ActionEvent ev) {

		chooser.showSaveDialog(frame);

		File file = chooser.getSelectedFile();

		nomeArquivo = file.getAbsolutePath();

		PrintWriter out = null;

		try {

			out = new PrintWriter(
					new FileWriter(new File(nomeArquivo + ".xml")));

			out.println("<duml>");

			for (ElementoDeModelo o : Controlador.getInstance()
					.getElementosDeModeloAdicionados()) {

				if (o instanceof Classe) {

					out.println("<objetobase>");

					out.println("<tipo>");
					out.println("classe");
					out.println("</tipo>");

					out.println("<serialNumber>");
					out.println(o.getSerialElementoDeModelo());
					out.println("</serialNumber>");

					out.println("<x>");
					out.println(o.getX());
					out.println("</x>");

					out.println("<y>");
					out.println(o.getY());
					out.println("</y>");

					out.println("<largura>");
					out.println(o.getLargura());
					out.println("</largura>");

					out.println("<altura>");
					out.println(o.getAltura());
					out.println("</altura>");

					out.println("<corcontorno>");
					out.println(((ObjetoBase) o).getCorContorno().toString());
					out.println("</corcontorno>");

					out.println("<corobjeto>");
					out.println(((ObjetoBase) o).getCorObjeto().toString());
					out.println("</corobjeto>");

					out.println("<coratributo>");
					out.println(((ObjetoBase) o).getCorAtributos().toString());
					out.println("</coratributo>");

					out.println("</objetobase>");
				}

				if (o instanceof Nota) {
					out.println("<objetobase>");

					out.println("<tipo>");
					out.println("nota");
					out.println("</tipo>");

					out.println("<serialNumber>");
					out.println(o.getSerialElementoDeModelo());
					out.println("</serialNumber>");

					out.println("<x>");
					out.println(o.getX());
					out.println("</x>");

					out.println("<y>");
					out.println(o.getY());
					out.println("</y>");

					out.println("<largura>");
					out.println(o.getLargura());
					out.println("</largura>");

					out.println("<altura>");
					out.println(o.getAltura());
					out.println("</altura>");

					out.println("<corcontorno>");
					out.println(((ObjetoBase) o).getCorContorno().toString());
					out.println("</corcontorno>");

					out.println("<corobjeto>");
					out.println(((ObjetoBase) o).getCorObjeto().toString());
					out.println("</corobjeto>");

					out.println("<coratributo>");
					out.println(((ObjetoBase) o).getCorAtributos().toString());
					out.println("</coratributo>");

					out.println("</objetobase>");
				}

				if (o instanceof Associacao) {
					out.println("<elementodeligacao>");

					out.println("<tipo>");
					out.println("associacao");
					out.println("</tipo>");

					out.println("<serialNumber>");
					out.println(o.getSerialElementoDeModelo());
					out.println("</serialNumber>");

					out.println("<x>");
					out.println(o.getX());
					out.println("</x>");

					out.println("<y>");
					out.println(o.getY());
					out.println("</y>");

					out.println("<origem>");
					out.println(((Associacao) o).getOrigem()
							.getSerialElementoDeModelo());
					out.println("</origem>");

					out.println("<destino>");
					out.println(((Associacao) o).getDestino()
							.getSerialElementoDeModelo());
					out.println("</destino>");

					out.println("<largura>");
					out.println(o.getLargura());
					out.println("</largura>");

					out.println("<altura>");
					out.println(o.getAltura());
					out.println("</altura>");

					out.println("<corcontorno>");
					out.println(((Associacao) o).getCorContorno().toString());
					out.println("</corcontorno>");

					out.println("<orientation>");
					out.println(((Associacao) o).getOrientacao());
					out.println("</orientation>");

					out.println("<espessura>");
					out.println(((Associacao) o).getEspessuraLinha());
					out.println("</espessura>");

					out.println("<rotulorelacionamento>");
					out.println(((Associacao) o).getRotuloRelacionamento());
					out.println("</rotulorelacionamento>");

					out.println("</elementodeligacao>");
				}

				if (o instanceof Composicao) {
					out.println("<elementodeligacao>");

					out.println("<tipo>");
					out.println("composicao");
					out.println("</tipo>");

					out.println("<serialNumber>");
					out.println(o.getSerialElementoDeModelo());
					out.println("</serialNumber>");

					out.println("<x>");
					out.println(o.getX());
					out.println("</x>");

					out.println("<y>");
					out.println(o.getY());
					out.println("</y>");

					out.println("<origem>");
					out.println(((Composicao) o).getOrigem()
							.getSerialElementoDeModelo());
					out.println("</origem>");

					out.println("<destino>");
					out.println(((Composicao) o).getDestino()
							.getSerialElementoDeModelo());
					out.println("</destino>");

					out.println("<largura>");
					out.println(o.getLargura());
					out.println("</largura>");

					out.println("<altura>");
					out.println(o.getAltura());
					out.println("</altura>");

					out.println("<corcontorno>");
					out.println(((Composicao) o).getCorContorno().toString());
					out.println("</corcontorno>");

					out.println("<orientation>");
					out.println(((Composicao) o).getOrientacao());
					out.println("</orientation>");

					out.println("<espessura>");
					out.println(((Composicao) o).getEspessuraLinha());
					out.println("</espessura>");

					out.println("<rotulorelacionamento>");
					out.println(((Composicao) o).getRotuloRelacionamento());
					out.println("</rotulorelacionamento>");

					out.println("</elementodeligacao>");
				}

				if (o instanceof Agregacao) {
					out.println("<elementodeligacao>");

					out.println("<tipo>");
					out.println("agregacao");
					out.println("</tipo>");

					out.println("<serialNumber>");
					out.println(o.getSerialElementoDeModelo());
					out.println("</serialNumber>");

					out.println("<x>");
					out.println(o.getX());
					out.println("</x>");

					out.println("<y>");
					out.println(o.getY());
					out.println("</y>");

					out.println("<origem>");
					out.println(((Agregacao) o).getOrigem()
							.getSerialElementoDeModelo());
					out.println("</origem>");

					out.println("<destino>");
					out.println(((Agregacao) o).getDestino()
							.getSerialElementoDeModelo());
					out.println("</destino>");

					out.println("<largura>");
					out.println(o.getLargura());
					out.println("</largura>");

					out.println("<altura>");
					out.println(o.getAltura());
					out.println("</altura>");

					out.println("<corcontorno>");
					out.println(((Agregacao) o).getCorContorno().toString());
					out.println("</corcontorno>");

					out.println("<orientation>");
					out.println(((Agregacao) o).getOrientacao());
					out.println("</orientation>");

					out.println("<espessura>");
					out.println(((Agregacao) o).getEspessuraLinha());
					out.println("</espessura>");

					out.println("<rotulorelacionamento>");
					out.println(((Agregacao) o).getRotuloRelacionamento());
					out.println("</rotulorelacionamento>");

					out.println("</elementodeligacao>");
				}

				if (o instanceof Generalizacao) {
					out.println("<elementodeligacao>");

					out.println("<tipo>");
					out.println("heranca");
					out.println("</tipo>");

					out.println("<serialNumber>");
					out.println(o.getSerialElementoDeModelo());
					out.println("</serialNumber>");

					out.println("<x>");
					out.println(o.getX());
					out.println("</x>");

					out.println("<y>");
					out.println(o.getY());
					out.println("</y>");

					out.println("<origem>");
					out.println(((Generalizacao) o).getOrigem()
							.getSerialElementoDeModelo());
					out.println("</origem>");

					out.println("<destino>");
					out.println(((Generalizacao) o).getDestino()
							.getSerialElementoDeModelo());
					out.println("</destino>");

					out.println("<largura>");
					out.println(o.getLargura());
					out.println("</largura>");

					out.println("<altura>");
					out.println(o.getAltura());
					out.println("</altura>");

					out.println("<corcontorno>");
					out.println(((Generalizacao) o).getCorContorno().toString());
					out.println("</corcontorno>");

					out.println("<orientation>");
					out.println(((Generalizacao) o).getOrientacao());
					out.println("</orientation>");

					out.println("<espessura>");
					out.println(((Generalizacao) o).getEspessuraLinha());
					out.println("</espessura>");

					out.println("<rotulorelacionamento>");
					out.println(((Generalizacao) o).getRotuloRelacionamento());
					out.println("</rotulorelacionamento>");

					out.println("</elementodeligacao>");
				}

			}

			out.println("</duml>");

			out.flush();
			out.close();

		} catch (IOException e) {

			e.printStackTrace();
		}

		System.out.println(out);
	}

}